#include "type.h"
#include "pic.h"
#include "message.h"
#include "protect.h"	
void hwint0();
void hwint1();
void hwint2();
void hwint3();
void hwint4();
void hwint5();
void hwint6();
void hwint7();
void hwint8();
void hwint9();
void hwint10();
void hwint11();
void hwint11();
void hwint12();
void hwint13();
void hwint14();
void hwint15();
void message();
void send();
void receive();
void divide_error();
void single_step_exception();
void nmi();
void breakpoint_exception();
void overflow();
void double_fault();
void bounds_check();
void inval_opcode();
void copr_not_available();
void double_fualt();
void copr_seg_overrun();
void inval_tss();
void segment_not_present();
void stack_exception();
void general_protection();
void page_fault();
void undefine();
void copr_error();
void init_pic(void);
void init_idt_desc(u8 vector,u16 selector,u8 attr,void (*handler)(void)){
	struct gate* p_gate=&idt[vector];
	u32 base=(u32)handler;
	p_gate->offset_low=base&0xFFFF;
	p_gate->selector=selector;
	p_gate->pcount=0;
	p_gate->attr2=attr;
	p_gate->offset_high=(base>>16)&0xFFFF;
}
void	init_prot(){
	init_pic();
	init_idt_desc(0,8,DA_386IGate|DA_DPL0,divide_error);
	init_idt_desc(1,8,DA_386IGate|DA_DPL0,single_step_exception);
	init_idt_desc(2,8,DA_386IGate|DA_DPL0,nmi);
	init_idt_desc(3,8,DA_386IGate|DA_DPL0,breakpoint_exception);
	init_idt_desc(4,8,DA_386IGate|DA_DPL0,overflow);
	init_idt_desc(5,8,DA_386IGate|DA_DPL0,bounds_check);
	init_idt_desc(6,8,DA_386IGate|DA_DPL0,inval_opcode);
	init_idt_desc(7,8,DA_386IGate|DA_DPL0,copr_not_available);
	init_idt_desc(8,8,DA_386IGate|DA_DPL0,double_fault);
	init_idt_desc(9,8,DA_386IGate|DA_DPL0,copr_seg_overrun);
	init_idt_desc(10,8,DA_386IGate|DA_DPL0,inval_tss);
	init_idt_desc(11,8,DA_386IGate|DA_DPL0,segment_not_present);
	init_idt_desc(12,8,DA_386IGate|DA_DPL0,stack_exception);
	init_idt_desc(13,8,DA_386IGate|DA_DPL0,general_protection);
	init_idt_desc(14,8,DA_386IGate|DA_DPL0,page_fault);
	init_idt_desc(15,8,DA_386IGate|DA_DPL0,undefine);
	init_idt_desc(16,8,DA_386IGate|DA_DPL0,copr_error);

	init_idt_desc(INT_VECTOR_IRQ0+0,8,DA_386IGate|DA_DPL0,hwint0);
	init_idt_desc(INT_VECTOR_IRQ0+1,8,DA_386IGate|DA_DPL0,hwint1);
	init_idt_desc(INT_VECTOR_IRQ0+2,8,DA_386IGate|DA_DPL0,hwint2);
	init_idt_desc(INT_VECTOR_IRQ0+3,8,DA_386IGate|DA_DPL0,hwint3);
	init_idt_desc(INT_VECTOR_IRQ0+4,8,DA_386IGate|DA_DPL0,hwint4);
	init_idt_desc(INT_VECTOR_IRQ0+5,8,DA_386IGate|DA_DPL0,hwint5);
	init_idt_desc(INT_VECTOR_IRQ0+6,8,DA_386IGate|DA_DPL0,hwint6);
	init_idt_desc(INT_VECTOR_IRQ0+7,8,DA_386IGate|DA_DPL0,hwint7);

	init_idt_desc(INT_VECTOR_IRQ8+0,8,DA_386IGate|DA_DPL0,hwint8);
	init_idt_desc(INT_VECTOR_IRQ8+1,8,DA_386IGate|DA_DPL0,hwint9);
	init_idt_desc(INT_VECTOR_IRQ8+2,8,DA_386IGate|DA_DPL0,hwint10);
	init_idt_desc(INT_VECTOR_IRQ8+3,8,DA_386IGate|DA_DPL0,hwint11);
	init_idt_desc(INT_VECTOR_IRQ8+4,8,DA_386IGate|DA_DPL0,hwint12);
	init_idt_desc(INT_VECTOR_IRQ8+5,8,DA_386IGate|DA_DPL0,hwint13);
	init_idt_desc(INT_VECTOR_IRQ8+6,8,DA_386IGate|DA_DPL0,hwint14);
	init_idt_desc(INT_VECTOR_IRQ8+7,8,DA_386IGate|DA_DPL0,hwint15);
	init_idt_desc(INT_VECTOR_SEND,8,DA_386IGate|DA_DPL3,send);
	init_idt_desc(INT_VECTOR_RECV,8,DA_386IGate|DA_DPL3,receive);
}
